package com.ecr.hub.front.bean.managed;

import java.util.List;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.ecr.hub.ApplicationException;
import com.ecr.hub.front.bean.AbstractManagedBean;
import com.ecr.hub.model.enumeration.HubObjectActive;
import com.ecr.hub.model.rail.Rail;
import com.ecr.hub.service.destination.IDestinationRailTranscoder;
import com.ecr.hub.service.rail.IRailManager;
import com.ecr.hub.util.ManagedBeanUtils;
import com.ecr.hub.util.MessageUtils;

@Controller("railManaged")
@Scope("session")
public class RailManagedBean extends AbstractManagedBean {

	private static final long serialVersionUID = 1L;

	// La liste des voies.
	private List<Rail> lstRails;
	// L'index de la voie sur laquelle travaille le chef d'agence.
	private int currentRailIndex;
	// La voie courante sur lequel travaille le chef d'agence.
	private Rail currentRail;
	// Filtre sur le type de faisceau.
	private int typeBundleId;

	// Manager pour les ressources rail.
	@Resource(name = "railManager")
	private transient IRailManager railManager;

	// Ressource pour la liste des transcos rail / destination.
	@Resource(name = "destinationRailTranscoder")
	private transient IDestinationRailTranscoder destinationRailTranscoder;

	/**
	 * Génération de la liste complète des voies, ne pas oublier qu'une seule
	 * personne à la fois peut être connectée en écriture, ainsi, la liste
	 * présentée est à tous moments la représentation exacte de la base de
	 * données.
	 * 
	 * @throws ApplicationException
	 */
	@PostConstruct
	public void _getAllList() {
		try {
			setLstRails(railManager.getAllList());
		} catch (Exception e) {
			getErrorHandler(e);
		}
	}

	/**
	 * Comme cet écran est très peu utilisé, (un seul utilisateur et juste pour
	 * le paramétrage de l'application) on se contente d'utiliser la base de
	 * données pour faire le filtre (nouvelle requête). Si l'utilisateur demande
	 * tous les enregistrements, on prend la requête globale, sinon, on filtre
	 * avec l'identifiant du type de faisceau. Dans tous les cas, bien remettre
	 * le numéro de page à 1.
	 */
	public void filterTypeBundle() {

		try {
			if (typeBundleId == 0) {
				setLstRails(railManager.getAllList());
			} else {
				setLstRails(railManager.getListByTypeBundle(typeBundleId,
						HubObjectActive.ALL.getValue()));
			}
			resetPage();
		} catch (Exception e) {
			getErrorHandler(e);
		}
	}

	/**
	 * Mise à jour de la voie. La voie courante est replacée dans la liste après
	 * opération en base de données, cela évite de faire un select pour
	 * rafraîchir la liste des voies. On demande le rafraichissement du bean qui
	 * pilote l'affichage du hub.
	 */
	public void edit() {

		try {
			railManager.update(currentRail);
			lstRails.set(currentRailIndex, currentRail);
			MessageUtils.setMessageInfo("rail.modified");
			destinationRailTranscoder.refresh();
			RepositoryManagedBean.refresh();
			HubManagedBean.refresh();
		} catch (Exception e) {
			getErrorHandler(e);
		}
	}

	/**
	 * Méthode static pour pouvoir retrouver le bean dans la map session et
	 * demander le rafraichissement des ses informations à partir d'un autre
	 * managed bean. Si le bean n'est pas encore dans la map, on ne fait rien de
	 * particulier puisque ce dernier ira lire les informations au moment au il
	 * sera activé grâce à la méthode _get*.
	 */
	public static void refresh() {

		RailManagedBean rail = (RailManagedBean) ManagedBeanUtils
				.getExternalContext().getSessionMap().get("railManaged");
		if (null != rail)
			rail._getAllList();
	}

	// ****************************
	// Les getters et setters.
	// ****************************

	public List<Rail> getLstRails() {
		return lstRails;
	}

	public int getCurrentRailIndex() {
		return currentRailIndex;
	}

	public Rail getCurrentRail() {
		return currentRail;
	}

	public void setLstRails(List<Rail> lstRails) {
		this.lstRails = lstRails;
	}

	public void setCurrentRailIndex(int currentRailIndex) {
		this.currentRailIndex = currentRailIndex;
	}

	public void setCurrentRail(Rail currentRail) {
		this.currentRail = currentRail;
	}

	public int getTypeBundleId() {
		return typeBundleId;
	}

	public void setTypeBundleId(int typeBundleId) {
		this.typeBundleId = typeBundleId;
	}
}
